/**
 * i18n语法修复工具
 * 用于修复插值语法错误和处理i18n加载问题
 */

import i18n, { getSupportedLocales } from './i18n';
import { Toast } from 'vant';

// 重新定义展平函数避免导入可能存在的问题
function flattenMessagesLocal(messages: any, prefix = ''): Record<string, string> {
  return Object.keys(messages).reduce((acc, key) => {
    const prefixedKey = prefix ? `${prefix}.${key}` : key;
    if (typeof messages[key] === 'object' && messages[key] !== null) {
      Object.assign(acc, flattenMessagesLocal(messages[key], prefixedKey));
    } else {
      acc[prefixedKey] = messages[key];
    }
    return acc;
  }, {} as Record<string, string>);
}

/**
 * 检查语言文件中的插值语法错误
 * 如：缺少闭合的大括号 { -> }
 */
export function checkAndFixI18nSyntax() {
  // 检查是否在浏览器环境中
  if (typeof window === 'undefined') return;

  // 从原始语言消息中创建扁平化结构
  const messages = i18n.global.messages.value;
  const locales = getSupportedLocales();

  // 记录有错误的消息
  const errors: string[] = [];

  // 遍历所有语言
  locales.forEach(locale => {
    const localeKey = locale as keyof typeof messages;

    if (!messages[localeKey]) {
      console.warn(`语言 ${locale} 未加载`);
      return;
    }

    // 创建扁平化版本检查
    const flatMsgs = flattenMessagesLocal(messages[localeKey]);

    // 检查每个消息中的大括号配对
    Object.entries(flatMsgs).forEach(([key, value]) => {
      if (typeof value !== 'string') return;

      // 计算大括号数量是否匹配
      const openCount = (value.match(/{/g) || []).length;
      const closeCount = (value.match(/}/g) || []).length;

      if (openCount !== closeCount) {
        errors.push(`[${locale}] ${key}: "${value}" 大括号不配对，开={${openCount}，闭={${closeCount}}`);
      }
    });
  });

  // 返回错误报告
  if (errors.length > 0) {
    console.error('发现插值语法错误:', errors);
    return errors;
  }

  return null;
}

/**
 * 监听i18n加载错误并自动恢复
 */
export function setupI18nErrorHandling() {
  // 创建全局错误处理
  window.addEventListener('error', (event: ErrorEvent) => {
    // 检查是否是i18n相关错误
    if (event.filename?.includes('i18n') || event.message?.includes('i18n')) {
      console.error('i18n错误:', event.message);

      // 检查是否是常见的语法错误
      if (event.message.includes('SyntaxError') || event.message.includes('26')) {
        // 显示友好提示
        Toast.fail('语言文件有语法错误，已切换到英文');

        // 尝试切换到英文语言回退
        setTimeout(() => {
          try {
            // 动态导入setLocale避免循环依赖
            import('./i18n').then(({ setLocale }) => {
              setLocale('en');

              // 如果语法错误严重，尝试重载页面
              setTimeout(() => {
                if (document.querySelectorAll('.van-toast').length > 0) {
                  console.warn('切换语言后仍有错误，尝试重载页面');
                  window.location.reload();
                }
              }, 1000);
            });
          } catch (e) {
            console.error('切换语言失败:', e);
          }
        }, 500);

        // 阻止错误继续传播
        event.preventDefault();
        return false;
      }
    }
  });
}

/**
 * i18n加载诊断助手
 * 用于分析和修复语言文件加载和使用问题
 */
export function diagnoseI18nLoading() {
  const diagnostics: any = {
    availableLocales: i18n.global.availableLocales,
    currentLocale: i18n.global.locale.value,
    loadedLocales: Object.keys(i18n.global.messages.value),
    urlLang: new URLSearchParams(window.location.search).get('lang'),
    storedLang: localStorage.getItem('userLanguage'),
    browserLang: navigator.language,
    messages: {}
  };

  // 检查语言文件加载情况
  diagnostics.loadedLocales.forEach((locale: string) => {
    const localeKey = locale as keyof typeof i18n.global.messages.value;
    const msgs = i18n.global.messages.value[localeKey];

    if (msgs) {
      diagnostics.messages[locale] = {
        keyCount: Object.keys(msgs).length,
        hasBasicTitle: !!(
          (msgs as any).basicInfo?.title ||
          (msgs as any)['basicInfo.title']
        ),
        format: (msgs as any).basicInfo ? '嵌套对象' : '扁平键值',
        flatKeyCount: Object.keys(flattenMessagesLocal(msgs)).length
      };
    } else {
      diagnostics.messages[locale] = {
        error: '语言文件未加载'
      };
    }
  });

  // 检查URL语言参数是否正确应用
  if (diagnostics.urlLang && diagnostics.urlLang !== diagnostics.currentLocale) {
    console.warn('URL语言参数未正确应用', {
      urlLang: diagnostics.urlLang,
      currentLocale: diagnostics.currentLocale
    });
  }

  return diagnostics;
}

// 导出默认的诊断和修复函数
export default {
  checkAndFixI18nSyntax,
  setupI18nErrorHandling,
  diagnoseI18nLoading
}; 